#include <iostream>

using std::cout;
using std::endl;

//在定义时，不知道该函数会传递几个参数过来
template <class ... Args>
void print(Args... args)
{
    cout << "sizeof...(Args):" << sizeof...(Args)<< endl;
    cout << "sizeof...(args):" << sizeof...(args)<< endl;
}

void test0()
{
    //在实际调用时，编译器就知道有几个了
    print(1, 1.1, 'a', "hello");
}

//递归调用时，函数的出口
/* void display() */
/* {   cout << endl;   } */

template <class T>
void display(T t)
{
    cout << t << endl;
}

//1个箱子的物件可以分成1件和剩下的 N-1件
template <class T, class ... Args> //...在参数包的左边时，称为打包
//void display(Args... args) 
void display(T t, Args... args) //
{
    cout << t << endl;
    //在实际调用时，应该要将箱子中的物件全部展开,就是可变参数的传递
    display(args...);//... 在函数参数包右边时，称为解包
}

void test1()
{
    display(1, 1.1, 'a', "hello");
    //cout << 1 << endl;
    //display(1.1, 'a', "hello");
    //  cout << 1.1 << endl;
    //  display('a', "hello");
    //      cout << 'a' << endl;
    //      display("hello");
    //          cout << "hello" << endl;
    //          display();
}


int main()
{
    /* test0(); */
    test1();


    return 0;
}

